package org.zero.log;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @author Zero
 */
public class Logger {
    public void beforeLog() {
        System.out.println("前置通知日志");
    }

    public void returnLog() {
        System.out.println("后置通知日志");
    }

    public void throwLog() {
        System.out.println("错误通知日志");
    }

    public void afterLog() {
        System.out.println("最终通知日志");
    }

    /**
     * 环绕通知：可以看作是四种通知的总体
     * 如果没有明确业务调用的方法，则只会执行通知方法，业务方法不会执行
     * 为解决此问题 Spring 框架为我们提供了 ProceedingJoinPoint 接口，使用该接口可明确业务方法
     *
     * @param proceedingJoinPoint
     * @return
     */
    public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint) {
        try {
            System.out.println("环绕通知（前置）日志");
            //明确业务调用的方法
            Object object = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
            System.out.println("环绕通知（后置）日志");
            return object;
        } catch (Throwable throwable) {
            System.out.println("环绕通知（错误）日志");
            throw new RuntimeException(throwable);
        } finally {
            System.out.println("环绕通知（最终）日志");
        }
    }
}
